export default function postSSEUniapp (params) {
    const {
        url,
        body,
        onMessage
    }=params;
    const isH5=typeof window!=='undefined'&&!!window?.fetch;

    // === 统一的 SSE 数据处理 ===
    const handleChunkReceived=(resData) => {
        let text='';

        // 检测是否是 base64 编码的字符串
        if(!isH5&&isBase64(resData)) {
            // 小程序端使用自定义的 base64 解码
            try {
                text=base64_decode(resData); // 使用你提供的解码方法
            } catch(error) {
                console.error("Base64 decode error: ", error);
                return ''; // 如果解码失败，返回空字符串
            }
        } else {
            // H5 环境使用 TextDecoder 解码
            if(isH5) {
                const decoder=new TextDecoder('utf-8', {
                    fatal: true
                });
                try {
                    text=decoder.decode(new Uint8Array(resData));
                } catch(error) {
                    console.error("TextDecoder error: ", error);
                    return ''; // 如果解码失败，返回空字符串
                }
            } else {
                // 小程序不支持 TextDecoder，使用 String.fromCharCode
                text=String.fromCharCode.apply(null, new Uint8Array(resData));
            }
        }

        // 对解码后的文本进行 URL 解码
        text=decodeURIComponent(escape(text)); // 先进行 `escape` 编码，再 `decodeURIComponent`

        return text;
    };

    // 判断是否是 base64 编码的字符串
    const isBase64=(str) => {
        const regex=/^[A-Za-z0-9+/=]+$/;
        return regex.test(str);
    };

    if(isH5) {
        // === H5 端 ===
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                Accept: 'text/event-stream',
            },
            body: JSON.stringify(body),
        })
            .then((response) => {
                if(!response.ok) throw new Error(`HTTP error! status: ${response.status}`);

                const reader=response.body?.getReader();
                if(!reader) throw new Error('No stream found');
                let buffer='';

                const read=() => {
                    reader.read().then(({
                        done,
                        value
                    }) => {
                        if(done) {
                            onMessage({
                                status: 'closed',
                                data: null,
                            });
                            return;
                        }

                        buffer+=new TextDecoder().decode(value, {
                            stream: true
                        });
                        const lines=buffer.split('\n');
                        buffer=lines.pop()||'';

                        for(let line of lines) {
                            line=line.trim();
                            if(line.startsWith('data:')) {
                                const jsonData=line.slice(5).trim();
                                if(jsonData==='[DONE]') {
                                    onMessage({
                                        status: 'closed',
                                        data: null,
                                    });
                                    return;
                                }

                                try {
                                    const parsed=JSON.parse(jsonData);
                                    onMessage({
                                        status: 'message',
                                        data: parsed,
                                    });
                                } catch {
                                    onMessage({
                                        status: 'error',
                                        data: jsonData,
                                    });
                                }
                            }
                        }

                        read();
                    }).catch((err) => {
                        onMessage({
                            status: 'error',
                            data: err.message,
                        });
                    });
                };

                onMessage({
                    status: 'connecting',
                    data: null,
                });
                read();
            })
            .catch((err) => {
                onMessage({
                    status: 'error',
                    data: err.message,
                });
            });
    } else {
        console.log("Executing on mini-program side");
        // === 小程序端 ===
        const requestTask=uni.request({
            url: url,
            timeout: 15000,
            responseType: 'text',
            method: 'POST',
            enableChunked: true, // 配置开启分块接收
            data: body,

            success: (response) => {
                // 成功回调
            },

            fail: (error) => {
                onMessage({
                    status: 'error',
                    data: error.errMsg||error,
                });
            },

            onHeadersReceived: (res) => {
                console.log(res.header);
            },
        });

        let buffer='';
        // 监听分块数据
        requestTask.onChunkReceived(function(res) {
            const text=handleChunkReceived(res.data);

            if(text==='') return; // 如果数据为空，跳过

            buffer+=text;
            const lines=buffer.split('\n');
            buffer=lines.pop()||'';

            for(let line of lines) {
                line=line.trim();
                if(line.startsWith('data:')) {
                    const jsonData=line.slice(5).trim();
                    if(jsonData==='[DONE]') {
                        onMessage({
                            status: 'closed',
                            data: null,
                        });
                        return;
                    }
                    try {
                        const parsed=JSON.parse(jsonData);
                        onMessage({
                            status: 'message',
                            data: parsed,
                        });
                    } catch(error) {
                        console.error("JSON parse error: ", error);
                        onMessage({
                            status: 'error',
                            data: jsonData,
                        });
                    }
                }
            }
        });

        onMessage({
            status: 'connecting',
            data: null,
        });
    }
}